﻿using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace helicopterFight
{
    /*
     * Klasa reprezentująca pomocniczą konsolę w grze głównie do debugowania.
     * Umożliwia śledzenie zmiennych oraz wyświetlanie komunikatów.
     * Niestety potrzebne jest użycie bloku unsafe co wymaga ustawienia paru opcji w 
     * projekcie, aby umożliwić jej poprawne funkcjonowanie.
     */
    unsafe public class Console
    {
        SpriteFont fontConsole;
        Vector2 consolePos = new Vector2(5, 5);

        List<traceFloat> vectFloat = new List<traceFloat>();
        List<traceString> vectString = new List<traceString>();
        List<String> vectMessages = new List<string>();

        public Boolean enabled = true;

        public void setFont(SpriteFont sf)
        {
            fontConsole = sf;
        }

        public void draw(SpriteBatch sb)
        {
            if (enabled)
            {
                Vector2 line = consolePos;
                line.X += 5;
                sb.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
                sb.DrawString(fontConsole, "Konsola:", new Vector2(5, 5), Color.Black);

                foreach (traceFloat trace in vectFloat)
                {
                    line.Y += 15;
                    sb.DrawString(fontConsole, trace.title + ':' + (float)*trace.variable, line, Color.Black);
                }
                foreach (traceString trace in vectString)
                {
                    line.Y += 15;
                    sb.DrawString(fontConsole, trace.title + ':' + trace.value, line, Color.Black);
                }
                foreach (String trace in vectMessages)
                {
                    line.Y += 15;
                    if (trace.Contains("ą"))
                    {
                    }
                    sb.DrawString(fontConsole, trace, line, Color.Black);
                }
                sb.End();
            }
        }

        public void setTraceFloat(String tt, ref float var)
        {
            fixed (float* va = &var)
            {
                vectFloat.Add(new traceFloat(tt, va));
            }
        }

        public void setTraceString(String tt, String vv)
        {
            foreach(traceString ts in vectString)
            {
                if(ts.title.Equals(tt))
                {
                    ts.value = vv;
                    return;
                }
            }
            vectString.Add(new traceString(tt, vv));
        }

        public void addMessage(String msg)
        {
            vectMessages.Add(msg);
        }
    }

    unsafe class traceFloat
    {
        public String title;
        public float *variable;
        public traceFloat(String t, float *v)
        {
            title = t;
            variable = v;
        }
    }

    class traceString
    {
        public String title;
        public String value;

        public traceString(String t, String v)
        {
            title = t;
            value = v;
        }
    }
}

